技术实现 顺势而为,在发布arm64架构的国产操作系统|Linux平台的RTMP|RTSP直播播放SDK之前,大牛直播SDK(官方)的直播播放SDK用一句比较流行的广告语叫遥遥领先,我们更是在前几年已经发布了 Linux X86_64架构的播放器,并得到了广泛的应用。 本次发布的可用于国产操作系统和Linux上的的RTMP|RTSP直播播放SDK, video输出基于X协议,audio输出采用PulseAudio和Alsa Lib实现。 除了常规功能如实时静音、快照、buffer time设定、网络自动重连等,RTMP支持扩展H265播放(支持Enhanced RTMP H.265播放), RTSP也支持H265播放。 架构的国产操作系统|Linux下的RTMP、RTSP直播播放,延迟依然毫秒级,随着国产操作系统在传统行业的推进,越来越多的场景需要高稳定性高延迟低的RTMP|RTSP播放器,本文抛砖引玉,感兴趣的开发者可以跟我单独探讨
0x00 背景 以前研究过一次在iPad上安装Linux系统,当时的方案是:AltStore + UTM,由于没有硬件虚拟化,性能非常差,只能安装服务器版Linux,而且UTM由于签名问题需要每7天续签一次 打开Trollstore,选择右上角+号,选择Install IPA File,然后选择刚才拷贝的ipa文件 在弹出的窗口中点击Install,很快就会安装完成 0x05 安装Ubuntu 22.04 arm64 桌面版 现在Linux系统的arm生态已经很健全了,基本上常见的应用都有提供对应的arm版本。 将镜像ISO文件下载到设备中 打开UTM,点击创建一个新虚拟机,选择虚拟化(这种模式会开启硬件虚拟机) 然后选择Linux,添加刚才拷贝进来的iso镜像文件,后面是一些CPU、内存等硬件相关的参数配置 保存后启动虚拟机,开始进行安装,Ubuntu也支持Live方式使用,可以先体验一下 安装完成后进入系统,可以做一些个性化界面优化(访问虚拟机需要外接键盘和鼠标才能操作) 至此,一个便携式Linux系统已经安装完成
因此,构建在国产操作系统与 ARM64 芯片上的 RTMP/RTSP 低延迟播放器技术,不仅是技术适配,更是保障国家数字底座安全可信的关键一环。 现实情况却是:难题说明国内常见业务协议 RTSP/RTMP 在 ARM64 适配度不均衡各厂硬件能力差异巨大国产 OS 图形栈 X11/Wayland 并存,兼容性挑战大渲染路径稳定性为核心难点专网设备数量庞大 因此,大牛直播SDK选择将 流媒体播放能力率先迁移至国产 OS + ARM64 体系,正是面对现实痛点做出的关键突破: 工程上最复杂 行业上最需要 落地上最有价值尤其是对 RTSP / RTMP 的深度优化 五、多路 RTSP/RTMP 播放器 Demo:架构与源码说明为了验证上述能力在国产 ARM64 平台上的稳定性,我们实现了一个 多实例低延迟播放器 Demo,支持: 多路流同时播放 自适应窗口布局 六、国产 ARM64 实测表现与工程部署建议我们在多款国产 ARM64 平台及主流国产 Linux 发行版环境中进行了功能与稳定性验证,整体结论如下——① 播放稳定性 多路播放可持续运行,无明显卡顿或黑屏情况
AArch64栈的结构 Arm64有4种栈,分别是空增栈(Empty Ascendant Stack,EA)、空减栈(Empty Descendant Stack,ED)、满增栈(Full Ascendant 常用的是满减栈,Linux内核也使用满减栈。 下图是一个满减栈的示意图,高地址为栈顶,低地址为栈低,栈向低地址方向生长,如右边的箭头所示。栈指针SP指向栈底(栈低保存了数据)。 AArch64过程调用标准中寄存器的使用规则 下面是Arm64程序调用标准规定的通用寄存器的使用方法。
3.2 在树莓派上搭建FRP内网穿透服务 3.2.1 服务端 - frps(VPS服务器) 1.下载程序 我的VPS服务器是unbuntu系统,使用的是arm64架构,所以需要下载arm64架构的frp wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_amd64 .tar.gz 解压 tar -xzvf frp_0.20.0_linux_amd64.tar.gz 新建文件夹 sudo mkdir -p /usr/local/frp 移动 sudo mv frp_ 0.18.0_linux_amd64 /usr/local/frp cd /usr/local/frp 确保frps程序具有可执行权限 chmod +x frps 说明:目录下只主要关注4个文件,分别是 客户端 - frpc (树莓派) 1.下载FRP: wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_arm.tar.gz
b.eq 0x104016218 ;判断w0是否相等于1,是跳转执行相应命令adrp x0,1 add x0,x0,#0xf7d,否执行下一句
为什么要学ARM64? android 5.0系统就开始引入Arm64-v8a,它用于支持全新的AArch64架构,这个架构也就是我们要学习的arm64汇编。 那么我们利用IDA(反汇编工具)进行静态逆向分析so文件、或者IDA动态调试so文件,都需要和arm64汇编代码打交道,因此对于学习掌握好ARM64汇编对阅读反汇编代码能达到事半功倍的效果。 ARM64的汇编指令集中,有一部分指令的执行时影响状态寄存器的,比如add、sub、or汇编指令等,他们大都是运算指令(进行逻辑或算数运算) ? ARM64汇编的函数有那些需要重点关注? 1.函数调用约定是什么约定? ARM64汇编代码: ? 3.3.2 函数中有九个参数的,需要用栈寄存器来传递参数 源代码: ? ARM64汇编代码: ? 4.函数中的堆栈怎么平衡?
内核文档Documentation/arm64/memory.rst描述了ARM64 Linux内核空间的内存映射情况,应该是此方面最权威文档。 我们需要一个真实的调试手段来验证我们的想法,这个调试手段就是PTDUMP(Page Table Dump),相关的代码在ARM64内核的: arch/arm64/mm/ptdump.c和ptdump_debugfs.c 我用qemu启动了一个4GB内存的ARM64虚拟机,可以看到前1GB的虚拟地址空间大多数是PMD和PTE映射,后面的3GB,全是PUD映射: ? 牧春童鞋在“Linux阅码场”这里还有一些精彩的文章: 宋牧春:Linux设备树文件结构与解析深度分析(1) 宋牧春:Linux设备树文件结构与解析深度分析(2) 宋牧春:多图详解Linux内存分配器 slub 宋牧春:Linux内核内存corruption检查利器KASAN实现原理 后面我们期待牧春专门写一篇文章来深入描述他的patchset。
技术背景 无论是Windows平台还是Linux,多路播放诉求非常普遍,比如针对智慧工地、展馆、教育等宏观场景下的摄像头展示,关于RTSP或RTMP直播播放器开发需要注意的点,可参考之前博客,总的来说有以下一些点 代码实现 本文以大牛直播SDK(官方)的Linux平台为例,介绍下RTMP或RTSP流多路播放集成。 总结 多路RTMP或RTSP播放,涉及到性能和多路之间音视频同步、长时间播放稳定性等问题,Linux平台可参考的资料比较少,可选的方案比较少,感兴趣的可酌情参考。
本文基于大牛直播 SDK(SmartPlayerSDK)在 Linux ARM64 平台的 Demo 源码,结合实际的 C++ 封装与 X11 窗口管理代码,系统拆解如何在 Linux ARM64 环境下 ,实现一个支持多路并行、毫秒级延迟的 RTSP/RTMP 播放器。 一、整体架构:从 C 风格 SDK 到工程化播放器大牛直播 SDK 在 Linux 下的核心入口是一个纯 C 风格的结构体 SmartPlayerSDKAPI,里面是一组函数指针:Init/UnInit /Open/Close/SetURL/StartPlay/...在此之上,这套 Demo 做了三层清晰的分层: SDK API 层(C 接口) 负责 RTSP/RTMP 拉流、解码、渲染、事件回调等。 ARM64 多路播放器 Demo 展示了一条完整、可落地的行业级链路: SDK 层:跨 RTSP/RTMP 协议、解码、同步、OpenGL 渲染 句柄管理层:RAII + 事件分发 + 低延迟参数注入
上一篇讲了RTMP数据包中关于Header的数据组织格式,不过一个完整的RTMP数据包除了Header之外,紧跟着的是RTMP Body,这一篇就继续来说一下RTMP Body的数据组织结构了。 说到RTMP Body的数据包组织格式,就不得不提到AMF。 那么AMF和RTMP Body又有什么关系呢,不才,RTMP数据包的序列化就是按照AMF的格式进行的。 说完AMF,再回到我们的RTMP Body,RTMP Body就是按照AMF0规范,将数据包进行组织,然后再通过网络发送的。 好了,接下来就结合wireshark实际抓到的RTMP数据包,一起熟悉AMF0,同时也熟悉RTMP Body的数据包组织方式。 先看一下_result的数据包。 ?
rtmp的协议的数据包,总的来讲分为两大部分,一部分是Rtmp Header,另一部分为Rtmp Body,这一篇我们来主要讲解一下Rtmp Header的组织形式。 RTMP header的长度不固定,可能的长度为12字节,8字节,4字节,1字节。具体长度为多少个字节,由RTMP header数据包的第一个字节的高2位决定。 ? 抓包看下,RTMP HEADER的长度。 图中,RTMP Header的第一个字节为0x03,高两位的值为00,所以,整个RTMP Header的长度就是4个字节了。 知道了RTMP header的第一个字节的作用以后,接下来我们看下几种不同长度的RTMP Header。 12字节的RTMP Header ?
ARM64架构处理器采用48位物理寻址机制,最大可以寻找到256TB的物理地址空间。对于目前的应用来说已经足够了,不需要扩展到64位的物理地址寻址。 Linux内核在大多数体系结构中都把两个地址空间划分为用户空间和内核空间。 0x0000_0000_0000_0000到0x0000_ffff_ffff_ffff 内核空间:0xffff_0000_0000_0000到0xffff_ffff_ffff_ffff 64位的Linux 内核已经没有高端内存的概念了,因为48位的寻址空间已经足够大了 在QEMU实验平台上,ARM64架构的LInux内核的内存分布图如下: ? 如图所示,ARM64架构处理器的Linux内核内存布局图。ARM64架构处理器的Linux内核内存布局如下: ?
而国产硬软件一般也就是代指arm64硬件架构及在此基础上的linux定制发行版,最近一周刚好完成了一些支持arm64硬件架构的工作,这里总结一下。 一些常用的arm64软件源地址如下: centos的arm64 yum源地址是:https://mirrors.aliyun.com/centos-altarch/ ubuntu的arm64 apt源地址是 k8s支持arm64架构 其实k8s要支持arm64还算是比较简单,由于Go语言里进行跨平台交叉编译很简单,所以k8s核心的一些二进制文件及docker镜像均有arm64架构的,将正常部署的k8s集群中这些二进制文件都替换成 arm64架构的,k8s也就可以在arm64上正常运行了。 的就是arm64架构的二进制文件) docker: https://mirrors.aliyun.com/docker-ce/linux/(centos, ubuntu都有对应的docker arm64
大牛直播SDK(Github)多路RTMP/RTSP转RTMP转发软件,系原有转发SDK基础上,官方推出的Windows平台定制版。 如监控类摄像机、NVR等,通过厂商说明或Onvif工具,获取拉流的RTSP地址,图形化配置,完成拉流转发等操作,轻松实现标准RTMP服务器(或CDN)对接。 视频转发支持H.264、H.265(需要RTMP服务器或CDN支持扩展H.265),音频支持配置PCMA/PCMU转AAC后转发,并支持只转发/录制视频或音频,RTSP拉流端支持鉴权和TCP/UDP模式设置和 添加转发项配置信息 [image] 配置说明: 添加配置项:点击页面“添加”按钮: ² 序号:无需关注,系统自动生成; ² 名称:该路转发配置项的描述信息; ² 拉流地址(必须填):需要转发的RTSP或RTMP 地址; ² 推流RTMP地址:需要转推的RTMP地址; ² 推流播放地址:需要预览的播放地址; ² 音视频转发选项:可选择之转发音频或视频,亦或同时转发音视频; ² 录像参数配置:可选择录制音频或视频,
前言 最近在学习rtmp协议,在看官方文档的时候总是懵懵懂懂,硬生生看了两天,现在基本上了解rtmp协议了,想用自己觉得比较清晰的方式来讲解rtmp协议,希望能够对向我一样的初学者有所帮助。 本文将通过以下四部分讲解rtmp协议。 1、消息 2、块 3、rtmp的消息类型 4、实例分析rtmp传输过程 一、消息 消息是rtmp的基本数据单元,服务端和客户端通过在网络上发送RTMP消息进行通讯。 消息格式 RTMP消息头和载荷两部分。 上面已经详解讲解了rtmp的数据格式了,下面来讲解具体的rtmp协议内容。 载荷 块的载荷就是消息的载荷内容。 总结一下:消息是rtmp的基本数据单元,块是用于将消息重新封装在网络上传输。
RTMP 基础 RTMP 概念 与 HTTP(超文本传输协议)同样是一个基于 TCP 的 Real Time Messaging Protocol(实时消息传输协议)。 变量 file(GLOB rtmp_source *.c) # 编译静态库 add_library(rtmp STATIC ${rtmp_source} ) 在 中导入这个 CMakeLists.txt #XXX需要链接rtmp库 target_link_libraries(XXX rtmp ...) RTMP 视频数据 RTMP 视频流格式与 FLV 很相似,通过查看 FLV 的格式文档,就能够知道 RTMP 视频数据应该怎么拼接。 双声道:0x12 ,0x10 单声道:0x12 ,0x08 Nginx-RTMP 服务器搭建 Linux 操作: 下载 nginx wget http://nginx.org/download/nginx
RTMP消息块流和RTMP一起适用于多样性音视频应用程序,从一对一和一对 多向视频点播服务器直接广播到交互式会议应用程序。 RTMP协议是应用层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。 在基于传输层协议的链接建立完成后,RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接。 2. 3. rtmp协议握手过程 要建立一个有效的rtmp连接,首先经过”握手”阶段,规则如下: 客户端被指定依次向服务器发送C0,C1,C2三个chunk,服务器向客户端发送S0,S1,S2三个chunk ,大小1字节 版本:8比特,C0:客户端需求的rtmp版本,S0:服务器选择的rtmp版本,如图: 4.2 握手第二阶段: 客户端发送C1包,C1包大小1536字节,格式如下图: time:包含了一个时间戳
100006250~100006260处分别是拉伸栈空间,分别给零寄存器,w0,x1入栈数据。
整体架构大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器 release, x64 debug/releaseLinux(含麒麟操作系统)x86_64、aarch64Android平台armeabi-v7a, arm64-v8a, x86, x86_64iOS平台arm64 Linux平台x64_64架构|aarch64架构RTMP直播推送SDK音频编码:AAC/SPEEX;视频编码:H.264;推流协议:RTMP;[音视频]支持纯音频/纯视频/音视频推送;支持X11屏幕采集 ;支持外部编码后音视频数据对接;支持实时音量调节;支持扩展录像模块;支持Unity接口;支持H.264扩展SEI发送模块;支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux SmartPublisherDemo.exe; Windows C++工程:WIN-PublisherSDK-CPP-Demo; Windows C#工程:WIN-PublisherSDK-CSharp-Demo; Linux